package tacos;

/*
* 要使用Lombok，首先要将其作为依赖添加到项目中。如果你使用Spring Tool Suite，只需要右键点击pom.xml，并从Spring上下文菜单选项中选择“Add Starters”。..
* 或者，也可以在pom.xml中通过如下的条目进行手动添加：
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>
* 还需要将Lombok作为扩展添加到IDE上，否则IDE将会报错，提示缺少方法和final属性没有赋值。
* import lombok.Data; 这里报错，搞了好久搞不懂，在pom.xml中引入了lombok的依赖，也Sync了Maven，但就是import lombok.Data;时报错，重启IDE后依然报错，
* 打开Project Structure后把Modules下的Dependencies下的Maven: org.projectlombok:lombok:1.18.20的Scope改成Provided，点击OK，就好了。神奇！
* */
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/*
* CommandLineRunner和ApplicationRunner的关键区别在于传递给各自run()方法的参数。
* CommandLineRunner会接受一个String类型的可变长度参数，代表传递给命令行的原始参数。
* 但是，ApplicationRunner会接受一个ApplicationArguments参数，其提供了访问已解析命令行组件参数的方法。
* 假设我们的应用接受命令行参数“--version 1.2.3”，而且我们的数据加载bean需要考虑这个参数。
* 如果使用CommandLineRunner，那么我们需要在数组中搜索“--version”，然后精确地去找数组中的下一个值。
* 但是，如果使用ApplicationRunner，那么我们可以查询给定的ApplicationArguments对象以获取“--version”参数，如下所示：
public ApplicationRunner dataLoader(IngredientRepository repo) {
  return args -> {
    List<String> version = args.getOptionValues("version");
    ...
  };
}
* */
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
//import org.springframework.data.annotation.Id;
import org.springframework.data.domain.Persistable;
import tacos.data.IngredientRepository;

import javax.persistence.Entity;
import javax.persistence.Id;

// 类级别的@Data注解就是由Lombok提供的，它会告诉Lombok生成所有缺失的方法，同时还会生成所有以final属性为参数的构造器。
// 在使用Lombok的时候，你必须在IDE中安装Lombok插件。否则，IDE将无从得知Lombok提供了getter、setter和其他方法，并且会因为缺失这些方法而报错。
@Data
@Entity // 声明这是一个JPA实体
@AllArgsConstructor // 自动生成全参构造器
@NoArgsConstructor(access = AccessLevel.PROTECTED, force = true) // 强制使用无参构造器
// Ingredient类实现了Persistable接口，这是Spring Data JPA提供的一个接口，它允许我们将实体标记为新的或者是已经存在的。
public class Ingredient {
    @Id
    private final String id;
    private final String name;
    private final Type type;

    public enum Type {
        WRAP, PROTEIN, VEGGIES, CHEESE, SAUCE
    }
}
